#include "bmp.h"
#include <stdio.h>
// copyright fanfan team. Peteboule inc.

void initialise_bmp(FILE * fbmp, int nb_lignes, int nb_colonnes)
{
  int nb;

  bfType=0x4d42;
  header.bfSize=0;
  header.bfReserved1=0;
  header.bfReserved2=0;
  header.bfoffBits=1078;
  header.biSize=40;
  header.biWidth=nb_colonnes;
  header.biHeight=nb_lignes;
  header.biPlanes=1;
  header.biBitCount=8;
  header.biCompression=0;
  header.biSizeImage=(header.biWidth)*(header.biHeight);
  header.biXPelsPerMeter=23621;
  header.biYPelsPerMeter=23621;
  header.biClrUsed=256;
  header.biClrImportant=256;
  
  fwrite(&bfType,sizeof(bfType),1,fbmp);
  fwrite(&header.bfSize,sizeof(header.bfSize),1,fbmp);
  fwrite(&header.bfReserved1,sizeof(header.bfReserved1),1,fbmp);
  fwrite(&header.bfReserved2,sizeof(header.bfReserved2),1,fbmp);
  fwrite(&header.bfoffBits,sizeof(header.bfoffBits),1,fbmp);
  fwrite(&header.biSize,sizeof(header.biSize),1,fbmp);
  fwrite(&header.biWidth,sizeof(header.biWidth),1,fbmp);
  fwrite(&header.biHeight,sizeof(header.biHeight),1,fbmp);
  fwrite(&header.biPlanes,sizeof(header.biPlanes),1,fbmp);
  fwrite(&header.biBitCount,sizeof(header.biBitCount),1,fbmp);
  fwrite(&header.biCompression,sizeof(header.biCompression),1,fbmp);
  fwrite(&header.biSizeImage,sizeof(header.biSizeImage),1,fbmp);
  fwrite(&header.biXPelsPerMeter,sizeof(header.biXPelsPerMeter),1,fbmp);
  fwrite(&header.biYPelsPerMeter,sizeof(header.biYPelsPerMeter),1,fbmp);
  fwrite(&header.biClrUsed,sizeof(header.biClrUsed),1,fbmp);
  fwrite(&header.biClrImportant,sizeof(header.biClrImportant),1,fbmp);

  // 2. palette //
  for (nb=0;nb<header.biClrImportant;nb++)
    {
      VGAPalette[nb].i=0;
      VGAPalette[nb].b=0;
      VGAPalette[nb].g=0;
      VGAPalette[nb].r=0;
    }

  VGAPalette[0].b=255;
  VGAPalette[0].g=255;
  VGAPalette[0].r=255;

  VGAPalette[1].b=255;
  VGAPalette[1].g=0;
  VGAPalette[1].r=0;

  VGAPalette[2].b=0;
  VGAPalette[2].g=255;
  VGAPalette[2].r=0;

  VGAPalette[3].b=0;
  VGAPalette[3].g=255;
  VGAPalette[3].r=246;

  VGAPalette[4].b=0;
  VGAPalette[4].g=0;
  VGAPalette[4].r=255;

  VGAPalette[5].b=246;
  VGAPalette[5].g=255;
  VGAPalette[5].r=0;

  VGAPalette[6].b=246;
  VGAPalette[6].g=0;
  VGAPalette[6].r=255;

  VGAPalette[7].b=0;
  VGAPalette[7].g=160;
  VGAPalette[7].r=0;

  VGAPalette[8].b=0;
  VGAPalette[8].g=119;
  VGAPalette[8].r=178;

  VGAPalette[9].b=239;
  VGAPalette[9].g=191;
  VGAPalette[9].r=255;

  VGAPalette[10].b=178;
  VGAPalette[10].g=0;
  VGAPalette[10].r=178;

  VGAPalette[11].b=0;
  VGAPalette[11].g=0;
  VGAPalette[11].r=178;

  VGAPalette[12].b=0;
  VGAPalette[12].g=178;
  VGAPalette[12].r=178;

  VGAPalette[13].b=0;
  VGAPalette[13].g=166;
  VGAPalette[13].r=255;

  VGAPalette[14].b=255;
  VGAPalette[14].g=166;
  VGAPalette[14].r=0;

  VGAPalette[15].b=185;
  VGAPalette[15].g=227;
  VGAPalette[15].r=247;
  
  VGAPalette[16].b=200;
  VGAPalette[16].g=200;
  VGAPalette[16].r=200;

  VGAPalette[17].b=0;
  VGAPalette[17].g=0;
  VGAPalette[17].r=0;
  
  fwrite(VGAPalette,sizeof(VGAPalette),1,fbmp);
  return;
}


int sauve_en_bmp(int nb_lignes, int nb_colonnes, int * grille)
{
  FILE *fbmp;
  int i,j;
  int x;

  fbmp = fopen("sortie.bmp","wb");

  initialise_bmp(fbmp,nb_lignes,nb_colonnes);
    
  for (i=1;i<=nb_lignes;i++)
    {
      x=0;
      for (j=1;j<=nb_colonnes;j++)
	{
	  fwrite(&grille[i*nb_colonnes+j],1,1,fbmp);
	  x=(x+1)%4;
	}
      fwrite(&x,(4-x)%4,1,fbmp); // adressage bidon //
    }
  
  fclose(fbmp);
 
  return 0;
}


int sauve_en_fich_bmp(char * NomFich, int nb_lignes, int nb_colonnes, unsigned char * grille)
{
  FILE *fbmp;
  int i,j;
  int x;

  fbmp = fopen(NomFich,"wb");

  initialise_bmp(fbmp,nb_lignes,nb_colonnes);
    
  for (i=0;i<nb_lignes;i++)
    {
      x=0;
      for (j=0;j<nb_colonnes;j++)
	{
	  fwrite(&grille[i*nb_colonnes+j],1,1,fbmp);
	  x=(x+1)%4;
	}
      fwrite(&x,(4-x)%4,1,fbmp); // adressage bidon //
    }
  
  fclose(fbmp);
 
  return 0;
}





